package com.atguigu.stgy.common.handler;

import com.atguigu.stgy.common.exception.StgyException;
import com.atguigu.stgy.model.result.R;
import com.atguigu.stgy.model.result.ResultCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Date;

@RestControllerAdvice //
@Slf4j
public class StgyExcetionHandler {
    //knife4j访问失败的问题处理？
    //异常处理器： 当controller没有异常不生效，当controller接口有异常 会被异常处理器匹配捕获异常
    @ExceptionHandler(value = Exception.class)
    public R exception(Exception e){
      //打印异常日志: 打印堆栈异常日志
        log.error("出现异常：{} ,时间:{}" , ExceptionUtils.getStackTrace(e) , new Date());
        return R.fail();
    }
    /*
        我们希望 controller接口出现异常时

            异常处理器捕获到异常 然后可以生成一个失败的R对象，对象的code和message都可以从捕获的异常中获取到
            然后返回r对象给前端提示
        Exception:编译时异常，必须try catch处理 无法抛出
            对异常类进行扩展：
                   1、继承RuntimeException(运行时异常，不需要强制处理 所以可以抛出)
                   2、在自定义类中可以定义枚举类成员属性(用来接受抛出异常时的code和message)
                   3、编写自定义异常类的异常处理器  根据枚举对象返回一个失败的R对象
     */
    @ExceptionHandler(value = StgyException.class)
    public R exception(StgyException stgyException){
        if(stgyException.getE() !=null){
            log.error("出现异常：{} ,时间:{}" , ExceptionUtils.getStackTrace(stgyException.getE()) , new Date());

        }else{
            log.error("出现异常：{} ,时间:{}" , stgyException.getMessage() , new Date());
        }
        return R.fail(stgyException.getCodeEnum());
    }


//    @ExceptionHandler(value = RuntimeException.class)
//    public R exception(RuntimeException e){
//        //打印异常日志: 打印堆栈异常日志
//        log.error("出现异常：{} ,时间:{}" , ExceptionUtils.getStackTrace(e) , new Date());
//        return R.fail(ResultCodeEnum.ADMIN_CAPTCHA_CODE_ERROR)
//    }
}
